﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections.Generic;

/// <summary>
/// Summary description for ClientesBD
/// </summary>
public class ClientesBD
{
	//constructor de clientes
    public ClientesBD()
    {
    }
	
	//Consulta de clientes para cargar el grid/combobox, obtengo (cedJuridica y nombre)
    public DataTable ConsultarClientes()
    {
        DataTable resultados = new DataTable();
        SqlDataAdapter adpClientes = new SqlDataAdapter();
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select cedulaJuridica, nombreCliente from Clientes");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpClientes.SelectCommand = cmd;
            adpClientes.Fill(resultados);
        }

        return resultados;
    }

	//funcion de consulta de los datos especificos de un cliente, devuelve la entidad cliente	
    public ClientesEnt ConsultarCliente(int cedulaJuridica)
    {
        ClientesEnt resultado = null;
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar
            SqlCommand cmd = new SqlCommand("Select cedulaJuridica,	nombreCliente, correo, telefono, direccion from Clientes where cedulaJuridica = @cedulaJuridica");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@cedulaJuridica", cedulaJuridica));//especificacion 
															//del parametro Para consultar

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerCliente(dr);//obtengo la entidad de cliente
            }
        }
        return resultado;
    }

	//leer tupla correspondiente al cliente
    private ClientesEnt ObtenerCliente(SqlDataReader dr)
    {
        ClientesEnt resultado = null;

        if (dr.HasRows)
        {
            dr.Read();//leo la tupla
			//obtengo los valores

            int colCedJuridica = dr.GetOrdinal("CedulaJuridica");
            int colNombreCliente = dr.GetOrdinal("NombreCliente");
            int colCorreo = dr.GetOrdinal("Correo");
            int colTelefono = dr.GetOrdinal("Telefono");
            int colDireccion = dr.GetOrdinal("Direccion");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);
			
			//casteo los valores al tipo correspondiente
            int cedJuridica = (int)valores[colCedJuridica];
            string nombreCliente = (string)valores[colNombreCliente];
            string correo = (string)valores[colCorreo];
            int telefono = (int)valores[colTelefono];
            string direccion = (string)valores[colDireccion];

            resultado = new ClientesEnt(cedJuridica, nombreCliente, telefono, correo, direccion);
        }
        return resultado;
    }
	
	//Metodo de insercion del cliente en la base de datos
    public bool InsertarCliente(ClientesEnt cliente)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Clientes(cedulaJuridica,	nombreCliente, correo, telefono, direccion) values(@cedulaJuridica,	@nombreCliente, @correo, @telefono, @direccion)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego todos los parametro correspondientes a datos del entregable
                cmd.Parameters.Add(new SqlParameter("@cedulaJuridica", cliente.CedulaJuridica));
                cmd.Parameters.Add(new SqlParameter("@nombreCliente", cliente.Nombre));
                cmd.Parameters.Add(new SqlParameter("@correo", cliente.Correo));
                cmd.Parameters.Add(new SqlParameter("@telefono", cliente.Telefono));
                cmd.Parameters.Add(new SqlParameter("@direccion", cliente.Direccion));
                cmd.ExecuteNonQuery();
            }

        }
        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

        return resultado;
    }
	
	//elimina el cliente de la base de datos, recibe el id del cliente a eliminar	
    public bool EliminarCliente(int cedulaJuridica)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Clientes where cedulaJuridica = @cedulaJuridica");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@cedulaJuridica", cedulaJuridica));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }

	//Metodo de actualizacion de los datos de un Cliente
    public bool ActualizarCliente(int cedulaJurVieja, ClientesEnt cliente)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de modificacion
                SqlCommand cmd = new SqlCommand("Update Clientes set cedulaJuridica = @cedulaJuridica, nombreCliente = @nombreCliente, correo = @correo, telefono = @telefono, direccion = @direccion where cedulaJuridica = @cedulaJurVieja");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@cedulaJurVieja", cedulaJurVieja));
                cmd.Parameters.Add(new SqlParameter("@cedulaJuridica", cliente.CedulaJuridica));
                cmd.Parameters.Add(new SqlParameter("@nombreCliente", cliente.Nombre));
                cmd.Parameters.Add(new SqlParameter("@correo", cliente.Correo));
                cmd.Parameters.Add(new SqlParameter("@telefono", cliente.Telefono));
                cmd.Parameters.Add(new SqlParameter("@direccion", cliente.Direccion));
                cmd.ExecuteNonQuery(); //ejecuto consulta
            }
        }
        catch
        {
            resultado = false; //devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }



//***************************************CONTACTOS**********************************************
	
	
    //Obtiene el ultimo ID asignado a un contacto en la base de datos para usarlo como 
    //referencia en la simulacion de asignacion de ID en memoria.
    public int ObtenerUltimoIDContactos()
    {
        int resultado=0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select max(id) as ID from Contactos");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();

                    int colId = dr.GetOrdinal("Id");
                   

                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    resultado = (int)valores[colId];
                }
            }
        }

        return resultado;
    }
    
    //Obtiene todos los contactos almacenados en la base de datos que corresponden a contactos
    //del cliente a quien pertenece la cedula juridica enviada y los devuelve como parametros.
    public List<ContactosEnt> ConsultarContactos(int cedJurCliente)
    {
        List<ContactosEnt> resultados = null;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select id,	cedJurCliente, nombreContacto, telefono, puesto, departamento, correo from Contactos where cedJurCliente = @cedJurCliente");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@cedJurCliente", cedJurCliente));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerContactos(dr);
            }
        }

        return resultados;
    }

    //Crea una lista de contactos que devolver a partir de los datos obtenidos por
    //la consulta en SQL y la devuelve.
    private List<ContactosEnt> ObtenerContactos(SqlDataReader dr)
    {
        List<ContactosEnt> resultados = new List<ContactosEnt>();

        int colId = dr.GetOrdinal("ID");
        int colCedJurCliente = dr.GetOrdinal("CedJurCliente");
        int colNombreContacto = dr.GetOrdinal("NombreContacto");
        int colTelefono = dr.GetOrdinal("Telefono");
        int colPuesto = dr.GetOrdinal("Puesto");
        int colDepartamento = dr.GetOrdinal("Departamento");
        int colCorreo = dr.GetOrdinal("Correo");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            int cedJurCliente = (int)valores[colCedJurCliente];
            string nombreContacto = (string)valores[colNombreContacto];
            int telefono = (int)valores[colTelefono];
            string puesto = (string)valores[colPuesto];
            string departamento = (string)valores[colDepartamento];
            string correo = (string)valores[colCorreo];

            resultados.Add(new ContactosEnt(id, nombreContacto, telefono, correo, departamento, puesto, cedJurCliente));
        }

        return resultados;
    }
	
	//Consultar un contacto específico, recibe su id
    public ContactosEnt ConsultarContacto(int id)
    {
        ContactosEnt resultado = null;
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando de consulta de cuenta a ejecutar
            SqlCommand cmd = new SqlCommand("Select id,	cedJurCliente, nombreContacto, telefono, puesto, departamento, correo from Contactos where id = @id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id));//especificacion del parametro
															//Para consultar

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerContacto(dr);//obtengo la entidad de contacto
            }
        }
        return resultado;
    }

    //Crea un objeto contacto a partir del dato obtenido de la consulta en SQL y lo devuelve.
    private ContactosEnt ObtenerContacto(SqlDataReader dr)
    {
        ContactosEnt resultado = null;

        if (dr.HasRows)
        {
            dr.Read();

            int colId = dr.GetOrdinal("ID");
            int colCedJurCliente = dr.GetOrdinal("CedJurCliente");
            int colNombreContacto = dr.GetOrdinal("NombreContacto");
            int colTelefono = dr.GetOrdinal("Telefono");
            int colPuesto = dr.GetOrdinal("Puesto");
            int colDepartamento = dr.GetOrdinal("Departamento");
            int colCorreo = dr.GetOrdinal("Correo");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);

            int id = (int)valores[colId];
            int cedJurCliente = (int)valores[colCedJurCliente];
            string nombreContacto = (string)valores[colNombreContacto];
            int telefono = (int)valores[colTelefono];
            string puesto = (string)valores[colPuesto];
            string departamento = (string)valores[colDepartamento];
            string correo = (string)valores[colCorreo];

            resultado = new ContactosEnt(id, nombreContacto, telefono, correo, departamento, puesto, cedJurCliente);
        }
        return resultado;
    }

    //Inserta en la base de datos un nuevo contacto perteneciente al cliente enviado como parametro y
    //retorna la verificacion de la operacion.
    public bool InsertarContacto(ClientesEnt cliente, ContactosEnt contacto)
    {
        bool resultado = true;
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = new SqlCommand("Insert Contactos(cedJurCliente, nombreContacto, telefono, puesto, departamento, correo) values(@cedJurCliente, @nombreContacto, @telefono, @puesto, @departamento, @correo)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@cedJurCliente", cliente.CedulaJuridica));
                cmd.Parameters.Add(new SqlParameter("@nombreContacto", contacto.Nombre));
                cmd.Parameters.Add(new SqlParameter("@telefono", contacto.Telefono));
                cmd.Parameters.Add(new SqlParameter("@puesto", contacto.Puesto));
                cmd.Parameters.Add(new SqlParameter("@departamento", contacto.Departamento));
                cmd.Parameters.Add(new SqlParameter("@correo", contacto.Correo));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false;
        }

        return resultado;
    }

    //Elimina de la base de datos el contacto al cual pertenece el ID recibido como parametro
    //y devuelve la verificacion de la operacion.
    public bool EliminarContacto(int id)
    {
        bool resultado = true;
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = new SqlCommand("Delete from Contactos where ID = @ID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@ID", id));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false;
        }

        return resultado;
    }

    //Actualiza los datos del contacto recibido como parametro con base en el ID, el cual
    //no es modificable, y refleja los cambios en la base de datos, retorna una verificacion
    //de la operacion.
    public bool ActualizarContacto(ContactosEnt contacto)
    {
        bool resultado = true;
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = new SqlCommand("Update Contactos set nombreContacto = @nombreContacto, telefono = @telefono, puesto = @puesto, departamento = @departamento, correo = @correo where ID = @ID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@ID", contacto.Id));
                cmd.Parameters.Add(new SqlParameter("@nombreContacto", contacto.Nombre));
                cmd.Parameters.Add(new SqlParameter("@telefono", contacto.Telefono));
                cmd.Parameters.Add(new SqlParameter("@puesto", contacto.Puesto));
                cmd.Parameters.Add(new SqlParameter("@departamento", contacto.Departamento));
                cmd.Parameters.Add(new SqlParameter("@correo", contacto.Correo));
                cmd.ExecuteNonQuery();
            }
        }
        catch
        {
            resultado = false;
        }

        return resultado;
    }


    public List<ClientesEnt> ObtenerClientes()
    {
        List<ClientesEnt> resultados = new List<ClientesEnt>();

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select cedulaJuridica, nombreCliente from clientes");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();

            using (SqlDataReader dr = cmd.ExecuteReader())
            {

                int colCedula = dr.GetOrdinal("CedulaJuridica");
                int colNombre = dr.GetOrdinal("NombreCliente");

                object[] valores = new object[dr.FieldCount];

                while (dr.Read())
                {
                    dr.GetValues(valores);

                    int cedula = (int)valores[colCedula];
                    string nombre = (string)valores[colNombre];

                    resultados.Add(new ClientesEnt(cedula, nombre));
                }
            }
        }
        return resultados;
    }

}